package BaseDados;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 *
 * @author Leinad
 */
import Classes.Aluno;
import Classes.Cacifo;
import Classes.Data;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class AcessoBD {

    Connection conn = null;
    Statement query = null;
    CodigoSQL csql = new CodigoSQL();

    public AcessoBD() {
        try {
            Class c = Class.forName("com.mysql.jdbc.Driver");
            Driver driver = (Driver) c.newInstance();
            DriverManager.registerDriver((Driver) driver);
            abreConexao();
        } catch (Exception ex) {
            System.out.println("Erro ao iniciar a Ligação.");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void abreConexao() {
        try {
            conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/sgs", "root", "");
            //conn = (Connection) DriverManager.getConnection("82.102.29.15/aeisctei_sgs", "aeisctei", "x~R5}1-S{a0k");
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - abreconexao");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void abreStatement() {
        try {
            query = conn.createStatement();
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - abreStatement");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public ResultSet executaQuery(String sql) {
        ResultSet rset = null;
        try {
            rset = query.executeQuery(sql);
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - executaQuery");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return rset;
    }

    public int executaUpdate(String sql) {
        int rset = -1;
        try {
            rset = query.executeUpdate(sql);
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - executaUpdate");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return rset;
    }

    public void fechaStatement() {
        try {
            query.close();
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - fechaStatement");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void fechaConexao() {
        try {
            conn.close();
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - fechaConexao");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String checkUser(String utilizador, String password) {
        try {
            abreStatement();
            System.out.println("User - " + utilizador + " Pass - " + password);
            ResultSet result = executaQuery(csql.verificaLogin(utilizador, password));
            if (result.next()) {
                System.out.println("Nome: " + result.getString("nome"));
                String nome = result.getString("nome");
                fechaStatement();
                return nome;
            }
            fechaStatement();
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - checkUser");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public Aluno getAluno(int num) {
        abreStatement();
        Aluno socio = null;
        ResultSet rset = executaQuery(csql.getAluno(num));
        try {
            if(rset.next()){
            //System.out.println("N aluno: " + Integer.parseInt(rset.getString("nAluno")));

            boolean newsletter = false;
            boolean entidades = false;

            if (Integer.parseInt(rset.getString("newsletter")) == 1) {
                newsletter = true;
            }

            if (Integer.parseInt(rset.getString("entidades")) == 1) {
                entidades = true;
            }


            socio = new Aluno(Integer.parseInt(rset.getString("nAluno")), rset.getString("curso"), rset.getString("turma"), rset.getString("nome"), rset.getString("morada"), Integer.parseInt(rset.getString("codigoPostal1")), Integer.parseInt(rset.getString("codigoPostal2")), Integer.parseInt(rset.getString("contacto")), rset.getString("nascimento"), rset.getString("localidade"), Integer.parseInt(rset.getString("bi")), Integer.parseInt(rset.getString("contribuinte")), rset.getString("email"), Integer.parseInt(rset.getString("ultimoAnoPago")), newsletter, entidades);
            }

        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - getAluno");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }

        ResultSet cacifoSocio = executaQuery(csql.getCacifo(num));
        try {
            if (cacifoSocio.next()) {
                System.out.println("Há Cacifo!!");
                socio.setCacifo(new Cacifo(Integer.parseInt(cacifoSocio.getString("nAluno")), Integer.parseInt(cacifoSocio.getString("nCacifo")), cacifoSocio.getString("modalidade"), transformaStringEmData(cacifoSocio.getString("dataEntrega")), transformaStringEmData(cacifoSocio.getString("dataDevolucao")), Integer.parseInt(cacifoSocio.getString("caucao")), cacifoSocio.getString("observacoes")));
            }
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("SOCIO: " + socio);
        fechaStatement();
        return socio;
    }

    public String getAllAlunos() {
        abreStatement();
        ResultSet rset = executaQuery(csql.getAllAlunos());
        String tabela = "";
        tabela += "<table border=\"3\">";
        tabela += "<tr>";
        tabela += "<th>Nº Aluno</th>";
        tabela += "<th>Nome</th>";
        tabela += "<th>Modalidade</th>";
        tabela += "<th>Curso</th>";
        tabela += "<th>Pago</th>";
        tabela += "<th>Detalhes</th>";
        tabela += "</tr>";
        try {
            while (rset.next()) {
                tabela += "<tr>";
                tabela += "<td>" + rset.getString("nAluno") + "</td>";
                tabela += "<td>" + rset.getString("nome") + "</td>";
                tabela += "<td>" + rset.getString("modalidade") + "</td>";
                tabela += "<td>" + rset.getString("curso") + "</td>";
                tabela += "<td>" + rset.getString("ultimoAnoPago") + "</td>";
                tabela += "<td><a href=\"./Servlet?opcode=socio&nAluno=" + rset.getString("nAluno") + "\" >Ver</a></td>";
                tabela += "</tr>";
            }
            tabela += "</table>";
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - getAllAlunos");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        fechaStatement();
        return tabela;
    }

    public void insertSocio(Aluno socio) {
        System.out.println("AcessoBD - InserirSocio");
        abreStatement();
        System.out.println(socio);
        int newsletter = 0;
        if (socio.isNewsletter()) {
            newsletter = 1;
        }

        int entidades = 0;
        if (socio.isNewsletter()) {
            entidades = 1;
        }
        int rset = executaUpdate(csql.insertSocio(socio.getnAluno(), socio.getCurso(), socio.getTurma(), socio.getNome(), socio.getMorada(), socio.getCodigoPostal1(), socio.getCodigoPostal2(), socio.getContacto(), socio.getNascimento(), socio.getLocalidade(), socio.getBi(), socio.getContribuinte(), socio.getEmail(), socio.getUltimoAnoPago(), newsletter, entidades));
        fechaStatement();
    }

    public String getAllCursos() {
        String cursos = "";
        abreStatement();
        ResultSet rset = executaQuery(csql.getAllCursos());

        cursos += "<select name=\"curso\" style=\"text-align: center\">";
        cursos += "<center><option value=\"\" selected=\"true\">-- Curso --</option></center>";
        try {
            while (rset.next()) {
                cursos += "<option value=\"" + rset.getString("nome") + "\">" + rset.getString("nome") + "</option>";
            }
            cursos += "</select>";
        } catch (SQLException ex) {
            System.out.println("SQL Exception! AcessoBD - getAllCursos");
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        //System.out.println("Cursos:" + cursos);
        fechaStatement();
        return cursos;
    }

    public void updateSocio(int nAlunoInicial, int nAluno, String nome, String morada, String curso, String turma, int codigoPostal1, int codigoPostal2, String dataNasc) {
        abreStatement();
        executaUpdate(csql.updateSocio(nAlunoInicial, nAluno, curso, turma, nome, morada, codigoPostal1, codigoPostal2, dataNasc));
        fechaStatement();
    }

    public String getPesquisa(int nAluno, String nome, String modalidade, String curso) {

        abreStatement();
        String tabela = "";
        ResultSet rset;
        if (nAluno != 0 && nome != null && modalidade != null && curso != null) {
            rset = executaQuery(csql.getSocioPesquisaAll(nAluno, nome, modalidade, curso));

        } else if (nome != null && modalidade != null && curso != null) {
            rset = executaQuery(csql.getSocioPesquisaNMC(nome, modalidade, curso));

        } else if (nAluno != 0 && modalidade != null && curso != null) {
            rset = executaQuery(csql.getSocioPesquisaAMC(nAluno, modalidade, curso));

        } else if (nAluno != 0 && nome != null && curso != null) {
            rset = executaQuery(csql.getSocioPesquisaANC(nAluno, nome, curso));

        } else if (nAluno != 0 && nome != null && modalidade != null) {
            rset = executaQuery(csql.getSocioPesquisaANM(nAluno, nome, modalidade));

        } else if (nAluno != 0 && nome != null) {
            rset = executaQuery(csql.getSocioPesquisaAN(nAluno, nome));

        } else if (nAluno != 0 && modalidade != null) {
            rset = executaQuery(csql.getSocioPesquisaAM(nAluno, modalidade));

        } else if (nAluno != 0 && curso != null) {
            rset = executaQuery(csql.getSocioPesquisaAC(nAluno, curso));

        } else if (nome != null && modalidade != null) {
            rset = executaQuery(csql.getSocioPesquisaNM(nome, modalidade));

        } else if (nome != null && curso != null) {
            rset = executaQuery(csql.getSocioPesquisaNC(nome, curso));

        } else if (modalidade != null && curso != null) {
            rset = executaQuery(csql.getSocioPesquisaMC(modalidade, curso));

        } else if (nAluno != 0) {
            rset = executaQuery(csql.getSocioPesquisaA(nAluno));

        } else if (nome != null) {
            rset = executaQuery(csql.getSocioPesquisaN(nome));

        } else if (modalidade != null) {
            rset = executaQuery(csql.getSocioPesquisaM(modalidade));

        } else if (curso != null) {
            rset = executaQuery(csql.getSocioPesquisaC(curso));

        } else {
            rset = executaQuery(csql.getAllAlunos());
        }
        try {
            tabela += "<table border=\"3\">";
            tabela += "<tr>";
            tabela += "<th>Nº Aluno</th>";
            tabela += "<th>Nome</th>";

            tabela += "<th>Curso</th>";
            tabela += "<th>Pago</th>";
            tabela += "<th>Detalhes</th>";
            tabela += "</tr>";
            /*
             * if (!rset.next()) { System.out.println("Tabela Vazia");
             * tabela=""; return tabela; }
             */

            while (rset.next()) {
                //System.out.println("Nome: " + rset.getString("nome"));
                String nAlunoSocio = rset.getString("nAluno");
                String nomeSocio = rset.getString("nome");

                String cursoSocio = rset.getString("curso");


                tabela += "<tr>";
                tabela += "<td>" + nAlunoSocio + "</td>";
                tabela += "<td>" + nomeSocio + "</td>";

                tabela += "<td>" + cursoSocio + "</td>";
                tabela += "<td>" + rset.getString("ultimoAnoPago") + "</td>";
                tabela += "<td><a href=\"./Servlet?opcode=socio&nAluno=" + nAlunoSocio + "\" >Ver</a></td>";
                tabela += "</tr>";
            }
            tabela += "</table>";
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        fechaStatement();
        return tabela;

    }

    public void insertNovoCurso(String curso) {
        abreStatement();
        executaUpdate(csql.insertNovoCurso(curso));
        fechaStatement();
    }

    public void adicionarCacifo(int nAluno, int nCacifo, String modalidade, int caucao, String dataEnt, String dataDev, String obs) {
        abreStatement();
        Data dataEntrega = transformaStringEmData(dataEnt);
        Data dataDevolucao = transformaStringEmData(dataDev);
        if (dataDevolucao != null) {
            executaUpdate(csql.insertCacifo(nAluno, nCacifo, modalidade, dataEntrega, dataDevolucao, caucao, obs));
        } else {
            executaUpdate(csql.insertCacifo(nAluno, nCacifo, modalidade, dataEntrega, caucao, obs));
        }
        fechaStatement();
    }

    public Data transformaStringEmData(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        //System.out.println(s);
        Data data = new Data(Integer.parseInt(s.substring(0, 4)), Integer.parseInt(s.substring(5, 7)), Integer.parseInt(s.substring(8, 10)));
        //System.out.println(data);
        return data;
    }
}
